package com.atguigu.gmall.product.client;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.model.product.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author tongatong
 * @name ProductFeignClient
 * @description
 * @date 2021/9/14
 * @time 15:55
 */
/*
 这里先不写fallback，fallback的功能是：
 当远程调用失败的时候，会执行fallback类中的对应方法。
 当写fallback的时候，这里的@Repository，注解需要注掉，
 @Repository注解应该写到fallback后面的，实现类中。
 */
//@FeignClient(value ="service-product", fallback = ProductDegradeFeignClient.class)
@FeignClient(value ="service-product")
@Repository
public interface ProductFeignClient {
    /**
     * 根据skuId获取sku信息
     *
     * @param skuId skuId
     * @return sku信息
     */
    @GetMapping("/api/product/inner/getSkuInfo/{skuId}")
    SkuInfo getSkuInfo(@PathVariable("skuId") Long skuId);


    /**
     * 通过三级分类id查询分类信息
     * @param category3Id category3Id
     * @return 分类列表的id和name
     */
    @GetMapping("/api/product/inner/getCategoryView/{category3Id}")
    BaseCategoryView getCategoryView(@PathVariable("category3Id")Long category3Id);

    /**
     * 获取sku最新价格
     *
     * @param skuId skuId
     * @return sku的价格
     */
    @GetMapping("/api/product/inner/getSkuPrice/{skuId}")
    BigDecimal getSkuPrice(@PathVariable(value = "skuId") Long skuId);

    /**
     * 根据spuId，skuId 查询销售属性集合
     *
     * @param skuId skuId
     * @param spuId spuId
     * @return 销售属性集合
     */
    @GetMapping("/api/product/inner/getSpuSaleAttrListCheckBySku/{skuId}/{spuId}")
    List<SpuSaleAttr> getSpuSaleAttrListCheckBySku(@PathVariable("skuId") Long skuId, @PathVariable("spuId") Long spuId);

    /**
     * 根据spuId 查询map 集合属性
     * @param spuId spuId
     * @return (values_id, sku_id)
     */
    @GetMapping("/api/product/inner/getSkuValueIdsMap/{spuId}")
    Map<Object, Object> getSkuValueIdsMap(@PathVariable("spuId") Long spuId);

    //  根据spuId 获取海报数据
    @GetMapping("/api/product/inner/findSpuPosterBySpuId/{spuId}")
    List<SpuPoster> getSpuPosterBySpuId(@PathVariable Long spuId);

    /**
     * 通过skuId 集合来查询数据
     * @param skuId skuId
     * @return 平台属性信息集合
     */
    @GetMapping("/api/product/inner/getAttrList/{skuId}")
    List<BaseAttrInfo> getAttrList(@PathVariable("skuId") Long skuId);

    /**
     * 获取全部分类信息
     * @return 分类信息
     */
    @GetMapping("/api/product/getBaseCategoryList")
    Result<List<JSONObject>> getBaseCategoryList();

    /**
     * 通过品牌Id 集合来查询数据
     * @param tmId 品牌id
     * @return 品牌信息
     */
    @GetMapping("/api/product/inner/getTrademark/{tmId}")
    BaseTrademark getTrademark(@PathVariable("tmId")Long tmId);


}
